/*
    Estado           Metodo
    SP                 listarCampanias - Diego
    SP                 listarMicrositiosSinCampania - Diego
    SP                 modificarCampania - Diego

 */

package gestores.administracion;

import dal.ArticuloDAL;
import dal.CampaniaDAL;

import dal.MicrositioDAL;

import excepciones.AvwException;
import gestores.pagina.GestorPrincipal;

import java.util.ArrayList;
import java.util.HashMap;

import java.util.logging.Level;
import java.util.logging.Logger;

import negocio.ArticuloWeb;
import negocio.CampaniaWeb;

import negocio.MicrositioWeb;

import util.Utiles;

public class GestorCampania {

    static final Logger logger = Utiles.iniciarLogger("GestorCampania", true);

    /**
     * Lista las campanias con los siguientes datos:
     * "camCodigo" codigo, "camNombre" nombre,"camFechaDesde" fecha desde,
     * "camFechaaHasta" fecha hasta, "mswNombre" nombre del micrositio
     * al que esta asociado (si posee) 
     * true si se encuentra definidos los articulos destacados o 
     * false en caso contrario.
     * @return ArrayList<HashMap>.
     */
    public static ArrayList<HashMap> listarCampanias() throws AvwException, NullPointerException {
        ArrayList<HashMap> campanias = new ArrayList<HashMap>();

        for (CampaniaWeb cw: CampaniaDAL.listarCampanias()) {
            HashMap hashMap = new HashMap();
            hashMap.put("camCodigo", cw.getCamCodigo());
            hashMap.put("camNombre", cw.getCamNombre());
            hashMap.put("camFechaDesde", cw.getCamFechaDesde());
            hashMap.put("camFechaHasta", cw.getCamFechaHasta());
            
            MicrositioWeb msw = CampaniaDAL.obtenerMicrositioDeCampania(cw);
            hashMap.put("mswCodigo", util.Utiles.noNull(msw.getMswCodigo()));
            hashMap.put("mswNombre", util.Utiles.noNull(msw.getMswNombre()));
            hashMap.put("mswUrl", util.Utiles.noNull(msw.getMswUrl()));
            
            if (ArticuloDAL.hayArticuloCampaniaDestacado(new CampaniaWeb(cw.getCamCodigo()))) {
                hashMap.put("camDefinida", "true");
            } else{
                hashMap.put("camDefinida", "false");
            }
            
            campanias.add(hashMap);
        }

        return campanias;
    }

    /**
     * Listar las campanias vigentes con los siguientes datos:
     * "camCodigo" codigo, "camNombre" nombre,"camFechaDesde" fecha desde,
     * "camFechaaHasta" fecha hasta, "mswNombre" nombre del micrositio
     * al que esta asociado (si posee) 
     * true si se encuentra definidos los articulos destacados o 
     * false en caso contrario.
     * @return ArrayList<HashMap>.
     */
    public static ArrayList<HashMap> listarCampaniasVigentes() throws AvwException, NullPointerException {
        ArrayList<HashMap> campanias = new ArrayList<HashMap>();

        for (CampaniaWeb cw: CampaniaDAL.listarCampaniasVigente()) {
            HashMap hashMap = new HashMap();
            hashMap.put("camCodigo", cw.getCamCodigo());
            hashMap.put("camNombre", cw.getCamNombre());
            hashMap.put("camFechaDesde", cw.getCamFechaDesde());
            hashMap.put("camFechaHasta", cw.getCamFechaHasta());
            
            MicrositioWeb msw = CampaniaDAL.obtenerMicrositioDeCampania(cw);
            hashMap.put("mswCodigo", util.Utiles.noNull(msw.getMswCodigo()));
            hashMap.put("mswNombre", util.Utiles.noNull(msw.getMswNombre()));
            hashMap.put("mswUrl", util.Utiles.noNull(msw.getMswUrl()));
            
            if (ArticuloDAL.hayArticuloCampaniaDestacado(new CampaniaWeb(cw.getCamCodigo()))) {
                hashMap.put("camDefinida", "true");
            } else{
                hashMap.put("camDefinida", "false");
            }
            
            campanias.add(hashMap);
        }

        return campanias;
    }

    /**
     * Lista micrositios con los siguientes datos de los micrositios
     * sin campanias asociadas: mswCodigo y mswNombre.
     * @return ArrayList<HashMap>.
     * 
     * */
    public static ArrayList<HashMap> listarMicrositiosSinCampania() throws AvwException, NullPointerException {
        ArrayList<HashMap> micrositios = new ArrayList<HashMap>();
        for (MicrositioWeb micrositioWeb: 
             MicrositioDAL.listarMicrositiosSinCampanias()) {
            HashMap micrositio = new HashMap();
            micrositio.put("mswCodigo", micrositioWeb.getMswCodigo());
            micrositio.put("mswNombre", micrositioWeb.getMswNombre());
            micrositio.put("mswUrl", micrositioWeb.getMswUrl());
            micrositios.add(micrositio);
        }

        return micrositios;
    }

    /**
     * Modifica campania pasada por parametro.
     * @param String codigo_campania.
     * @param String codigo_micrositio asignado.
     * */
    public static void modificarCampania(String codigo_campania, String codigo_micrositio){
        CampaniaWeb campaniaWeb = new CampaniaWeb();
        campaniaWeb.setCamCodigo(codigo_campania);
        campaniaWeb.setCamMicrositioWeb(new MicrositioWeb(codigo_micrositio));
        try {
            
            CampaniaDAL.modificarCampania(campaniaWeb);
        } catch (AvwException ex) {
            ex.printStackTrace();
        }
    }
    
    
    
    /**
         * Funcion recursiva para armar el menu izquierdo
         * @param indice nivel de menu
         * @param arrCategoria array de las categorias seleccionadas
         * @param codCampania codigo de la campania
         * @return html con las categorias de ese nivel
         */
    public static String menuCampania(Integer indice, String codCategoria, String[] arrCategoria, String codCampania){
        StringBuilder html = new StringBuilder();
        try{
            for (HashMap categoria : GestorPrincipal.listarCategoriaPorPadreYCampania(codCampania, codCategoria)){
                if ((arrCategoria.length > (indice + 1)) && 
                        ((String) categoria.get("cawCodigo")).equals(arrCategoria[indice + 1])){
                    html.append("<span class=\"menuTexto" + indice.toString() + 
                            "\"><a href=\"./index?accion=configuracionCampania&camCodigo="+codCampania+"&cawCodigo=" +
                            GestorPrincipal.stringArrCategoria(arrCategoria, (indice + 1)) +
                            (String) categoria.get("cawCodigo") + ":\">" + 
                            Utiles.formatearTexto((String) categoria.get("cawNombre")) + "</a><br /></span>");
                    html.append(menuCampania(indice + 1, ((String) categoria.get("cawCodigo")), arrCategoria, codCampania));
                }else{
                    if (esCategoriaConArticulosCampaniaNoHoja(((String) categoria.get("cawCodigo")), codCampania)){
                        html.append("<span class=\"menuTexto" + indice.toString() + 
                            "\"><a href=\"./index?accion=configuracionCampania&camCodigo="+codCampania+"&cawCodigo=" +
                            GestorPrincipal.stringArrCategoria(arrCategoria, (indice + 1)) +
                            (String) categoria.get("cawCodigo") + ":\">" + 
                            Utiles.formatearTexto((String) categoria.get("cawNombre")) + "</a><br /></span>");
                    }
                }
            }
        }catch(AvwException e){
            
        }
        return html.toString();
    }
    
    /**
     * Determina si la categoria pasada por parametro es una categoria con articulos
     * de la campania que tambien se pasa por parametro y que no son Categoria Hoja.
     * @codCategoria codigo de la categoria
     * @codCampania codigo de la campania
     * @return true en caso de si ser una categoria con articulos y que no es
     * categoria hoja.
     */
    public static Boolean esCategoriaConArticulosCampaniaNoHoja(String codCategoria, 
            String codCampania){
        
        // Verificamos si existen articulos de la campania de la categoria
        if (GestorPrincipal.hayArticulosCampaniaConCategoria(codCategoria,codCampania)){
            return false;
        }else{
            try{
                for (HashMap categoria : GestorPrincipal.listarCategoriaPorPadreYCampania(codCampania, codCategoria)){
                     if (GestorPrincipal.esCategoriaConArticulosCampania(((String) categoria.get("cawCodigo")), codCampania)){
                        return true;
                    }
                }
            }catch(AvwException e){
            
            }
        }
        
        return false;
    }

    private static void listarCategoriaPorPadreYCampania(String codCampania, String codCategoria) {
        throw new UnsupportedOperationException("Not yet implemented");
    }
}
